package test.反射;

import entity.Student;

import java.lang.reflect.Field;

/**
 * Created by chengxiaoqi1 on 2018/5/17.
 */
public class ReflectionField {
    public static void main(String[] args) {
        try {
            /** 1.批量
             *   1.1.java.lang.Class#getFields() 获取所有的公有字段
             *   1.2.java.lang.Class#getDeclaredFields() 获取所有的字段，包括 公有 受保护 默认 私有
             *
             *  2.单个
             *   2.1 java.lang.Class#getField(java.lang.String) 获取某个公有字段
             *   2.2 java.lang.Class#getDeclaredField(java.lang.String) 获取某个字段，可以是私有
             *
             *  3.设置字段的值
             *   3.1 Field --> public void set(Object obj,Object value):
             *    obj:要设置的字段所在的对象；
             *    value:要为字段设置的值；
             */
            Class stuCallzz = Class.forName("entity.Student");
            System.out.println("-- 获取所有公有字段 --");
            Field[] fields = stuCallzz.getFields();
            for (Field field : fields) {
                System.out.println(field);
            }

            System.out.println("-- 获取所有的字段 私有，公有， 受保护 , 默认 --");
            fields = stuCallzz.getDeclaredFields();
            for (Field field : fields) {
                System.out.println(field);
            }

            System.out.println("-- 获取公有字段并调用 --");
            Field field = stuCallzz.getField("name");
            System.out.println(field);
            Object obj = stuCallzz.getConstructor().newInstance(); //Student s = new Student()
            field.set(obj, "姓名"); //s.name = "姓名"
            Student student = (Student)obj;
            System.out.println("姓名：" + student.name);

            System.out.println("-- 获取私有字段并调用 --");
            field = stuCallzz.getDeclaredField("phoneNum");
            System.out.println(field);
            field.setAccessible(true);
            field.set(obj, "18888888888");
            System.out.println(student);
        } catch (Exception e) {

        }
    }
}
